#ifndef _MODBUS32_H_
#define _MODBUS32_H_

#include	 "sys.h"
#include    "HAL_Type.h" 

#define IED_ADDRESS 0x01    	
#define TIMER_INTERVAL 5    	
#define RX_BUFFER_SIZE1 20480
#define TX_BUFFER_SIZE1 150000

extern u8 CommRxBuffer[RX_BUFFER_SIZE1];    
extern u8 CommTxBuffer[TX_BUFFER_SIZE1];

extern u8 RxTimeOut;			
extern u8 TxTimeOut;			
//u16 *pSwapZone ;  								   	   
extern u32  TxCount;			
extern u32	RxCount;	    	 
extern u32	TxPosi; 

#define GetBit(data, offset) (((data) >> (offset)) & 0x0001)
#define SetBit(dat,i) ((dat)|=(0x0001<<(i)))
#define ClrBit(dat,i) ((dat)&=(~(0x0001<<(i))))

//CMD����
#define CMD_START 		0
#define CMD_STOP  		1
#define CMD_READFREE  	2

//config����
#define SAR_CHECK_EN				0
#define INSTANT_DISCON_EN			1
#define SKIP_END_PIN_EN				2
#define PIN_SELF_DIS_EN				3
#define AUTO_UPLOAD_AFTER_SCAN		4
#define AUTO_COMM_PRINT				15


#define PIN_DATA_TOTAL_COMPRESS_LEN sizeof(mCommData.PinDataTotalCompress)/sizeof(mCommData.PinDataTotalCompress[0])	
#define SKIP_END_PIN_DATA_LEN sizeof(mCommData.SkipEndPinData)/sizeof(mCommData.SkipEndPinData[0])
#define START_PINS_ARR_LEN sizeof(mCommData.StartPinsArray)/sizeof(mCommData.StartPinsArray[0])	
#define ONE_LOOP_DATAS_LEN sizeof(mCommData.OneLoopDatas)/sizeof(mCommData.OneLoopDatas[0])
#define EMPTY_START_PINS_LEN sizeof(mCommData.EmptyStartPinData)/sizeof(mCommData.EmptyStartPinData[0])
#define PIN_DATA_TOTAL_LEN sizeof(mCommData.PinDataTotal)/sizeof(mCommData.PinDataTotal[0])
#define PIN_DATA_TOTAL_PIN_DATA_LEN sizeof(mCommData.PinDataTotal[0].PinData)/sizeof(mCommData.PinDataTotal[0].PinData[0])
#define LED_START_PINS_LEN sizeof(mCommData.LedStartPinData)/sizeof(mCommData.LedStartPinData[0])
#define SCAN_PROBE_END_PINS_LEN sizeof(mCommData.ScanProbeEndPins)/sizeof(mCommData.ScanProbeEndPins[0])


typedef union _ConfigRegStu
{
	struct
	{
		u16 b0:1;
		u16 b1:1;
		u16 b2:1;
		u16 b3:1;
		u16 b4:1;
		u16 b5:1;
		u16 b6:1;
		u16 b7:1;
		u16 b8:1;
		u16 b9:1;
		u16 b10:1;
		u16 b11:1;
		u16 b12:1;
		u16 b13:1;
		u16 b14:1;
		u16 b15:1;
	} OneBit;
	u16 AllBits;
}ConfigRegUn;


typedef union _GpioDinStu
{
	struct
	{
		u16 b0:1;
		u16 b1:1;
		u16 b2:1;
		u16 b3:1;
		u16 b4:1;
		u16 b5:1;
		u16 b6:1;
		u16 b7:1;
		u16 b8:1;
		u16 b9:1;
		u16 b10:1;
		u16 b11:1;
		u16 b12:1;
		u16 b13:1;
		u16 b14:1;
		u16 b15:1;
	} OneBit;
	u16 AllBits;
}GpioDinUn;

typedef union _GpioDoutStu
{
	struct
	{
		u16 b0:1;
		u16 b1:1;
		u16 b2:1;
		u16 b3:1;
		u16 b4:1;
		u16 b5:1;
		u16 b6:1;
		u16 b7:1;
		u16 b8:1;
		u16 b9:1;
		u16 b10:1;
		u16 b11:1;
		u16 b12:1;
		u16 b13:1;
		u16 b14:1;
		u16 b15:1;
	} OneBit;
	u16 AllBits;
}GpioDoutUn;

typedef union _CmdRegStu
{
	struct
	{
		u16 CmdScanStart:1;				//1��ʼɨ��
		u16 CmdScanAccessoryStart:1;	//2����ɨ�迪ʼ
		u16 CmdAllScanStop:1;			//3ֹͣɨ��
		u16 CmdSelfCheck:1;				//4�����Լ�
		u16 CmdSelfCheckQuick:1;		//5�����Լ�
		u16 CmdReadEndDinFree:1;		//6�����е�ƽ	
		u16 CmdReadEndDinCurrent:1;		//7����ǰ��ƽ
		u16 CmdScanEmptyStartPins:1;	//8�յ�ɨ��
		u16 CmdScanEndPin:1;			//9��ֹ��ȫ��ɨ�迪ʼ������̽��
		u16 CmdResetDate:1;				//10��λɨ������
		u16 CmdResetPhyPin:1;			//11��λ������λ	
		u16 CmdResetAll:1;				//12��λ���У����ݺ�������λ��
		u16 CmdScanProbe:1;				//13ɨ����̽�� 20190605 add
		u16 CmdReadDataTotalCompress:1;	//14��ѹ������
		u16 CmdSetOnePinOrOneLoop:1;	//15����һ�����һ����·		
		u16 CmdScanLedStartPin:1;		//16��?��?				20190422 add
	} OneBit;
	u16 AllBits;
}CmdRegUn;

typedef struct _PinDataStu
{
	u16 StartPinNum;
	u16	PinData[128];
} PinDataStu;

typedef struct _OneLoopDataStu
{
	u16 StartPinNum;
	u16	EndPinNum;
} OneLoopDataStu;

typedef struct _data
{
	u16 IpNum;							//IP��ַ
	u16 EndPinNumMax;					//��ʹ�õ���ֹ�������	
	u16	SignalSetTime;					//�źŽ���ʱ��	
	u16 HwVersions[5];					//Ӳ���汾��
	u32 HwId[3];						//Ӳ��ID���96BIT
	
    u16 ConfigReg;						//���üĴ�����������SAR�㷨ʹ�ܣ�������˲�ϼ��ʹ��,����ɨ�����ֹ��ʹ�ܣ��ض�ʱ�Ƿ���ʾ��������ֹ��
	u16 CheckChannelNum;				//ͬʱ����ͨ����
	u16 CheckVoltageThreshold;			//����ѹ��ֵ
	
	u16 CmdRegUnused;					
	CmdRegUn CmdReg;					//����Ĵ���
	u16 CmdExecuteState;				//����ִ��״̬
	GpioDoutUn GpioDoutData;			//GPIO�������
	u16 GpioDinUnused;					//GPIO��������
	u16 EndPinDin;						//��ʼ�룬��ֹ�����ʱ������/��ǰ״̬�µ�����
	GpioDinUn GpioDinData;				//GPIO��������
	u16 ProbeEndPinNum;					//̽��̽������ֹ����	ɨ��һ�ֺ�������������ʹ�����4λ��ʾ���ڵ�������
	u16 ErrCode;						//�������
	u16 DevStauts;						//�豸������״̬��1����ͨ�����ɣ�2���������
	u16 GpioDinDataMap;					//GPIO����Ĵ�����ӳ��
	u16 ScanCntH;						//ɨ�����������16��
	u16 ScanCntL;						//ɨ�����������16��
	u32 PinDataTotalCompress[8192];		//��ͨ����ѹ����
	u16	SkipEndPinData[128];			//Ҫ��������ֹ��
	u16 StartPinsArray[2048];			//��ɨ�����ʼ�����	
	OneLoopDataStu OneLoopData;			//������һ��·����
	OneLoopDataStu OneLoopDatas[400];	//?��??�̣���????��2a��?
	u16	EmptyStartPinData[128];			//??��?��y?Y
	u16	LedStartPinData[128];			//LED?e��???����?����y?Y		20190422 add
	u16	ScanProbeEndPins[128];			//����?��1y3��?D��?��??��1?	20190605 add
	PinDataStu PinDataTotal[2048];		//��??1??��y?Y
} CommData;

//2022-3 add
typedef struct _moduleLock
{
	u16 updataStatus;
	u16	locknew; 
	u16	lockold; 
	u16	count; 
} ModuleLockStu;	//Կ�����Ľṹ�� �����ܣ���Կ�׽���������ʱ����������״̬
extern ModuleLockStu moduleLockStutas;

extern CommData mCommData;
extern void ModbusInit(void);
extern void TaskCommTimer(void);

extern void AutoUploadRegisters(u32 addr,u32 num);



#endif
